package ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener , ActionListener {
    //规定：表示游戏的主界面
    // 以后和游戏相关的所有逻辑都放在这里
    //定义一个数组用来管理数据

    int[] arr=new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
    //记录图片0即空白图片的位置
    int x=0;
    //管理图片路径
    String path="6.29\\image\\animal\\animal3\\";
    //定义一个正确的数组
    int[] win=new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
    //定义一个计步器
    int step=0;
    //创建功能菜单选项功能
    JMenuItem replyItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");
    //创建关于我们菜单选项功能
    JMenuItem accountItem=new JMenuItem("公众号");

    public GameJFrame(){

        //初始化界面
        initJFrame();
        //初始化菜单
        initJMenu();
        //初始化数据
        luanxu();
        //初始化图片
        initimage();

        //让界面显示出来（建议放在最后）
        this.setVisible(true);
    }
    //初始化图片
    private void initimage() {

        //清空所有图片
        this.getContentPane().removeAll();
        //判断是否胜利
        if(victory()){
            ImageIcon win=new ImageIcon("D:\\javacode\\heima_basicjava\\6.29\\image\\win.png");
            JLabel Win=new JLabel(win);
            Win.setBounds(203,283,197,73);
            this.getContentPane().add(Win);

        }
        //创建imageicon对象（加载图片）
        //指定图片添加的位置
        int i=0;
        for(int y=0;y<4;y++){       //控制行
            for(int x=0;x<4;x++){   //控制列
                //创建一个JLabel对象（管理容器）
                JLabel jLabel=new JLabel(new ImageIcon(path+arr[i]+".jpg"));
                jLabel.setBounds(x*105+83,y*105+134,105,105);
                //把管理容器添加到界面中
                //this.add(jLabel);
                //给图片设置边框
                jLabel.setBorder(new BevelBorder(1));

                this.getContentPane().add(jLabel);
                i++;
            }
            }

        //添加背景图
        //先加载的图片在上方，后加载的图片在下方
        ImageIcon bg=new ImageIcon("6.29\\image\\background.png");
        JLabel background=new JLabel(bg);
        //设置位置
        background.setBounds(40,40,508,560);
        //把背景图添加到界面
        this.getContentPane().add(background);

        //添加计步器
        JLabel Step=new JLabel("步数："+step);
        Step.setBounds(50,30,100,20);
        this.getContentPane().add(Step);

        //刷新界面
        this.getContentPane().repaint();
    }

    //初始化数据
    private void luanxu(){
        //生成顺序数组
        for (int i = 0; i < 16; i++) {
            arr[i]=i;
        }
        //打乱数组
        Random r=new Random();
        for(int i=0;i<16;i++){
            int num=r.nextInt(16);
            int tmp=arr[i];
            arr[i]=arr[num];
            arr[num]=tmp;
        }
        for (int i = 0; i < 16; i++) {
            System.out.println(arr[i]);
            if(arr[i]==0){
                x=i;
                System.out.println(x);
            }
        }
        }


    private void initJMenu() {
        //创建菜单对象
        JMenuBar jmenubar=new JMenuBar();
        //创建菜单选项
        JMenu funcationJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");

        //把选项功能添加到菜单选项里面
        funcationJMenu.add(replyItem);
        funcationJMenu.add(reLoginItem);
        funcationJMenu.add(closeItem);

        aboutJMenu.add(accountItem);
        //给各个条目添加事件
        replyItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);

        //把菜单选项添加到菜单里面
        jmenubar.add(funcationJMenu);
        jmenubar.add(aboutJMenu);
        //给界面设置菜单
        this.setJMenuBar(jmenubar);
    }

    private void initJFrame() {
        //设置宽高
        this.setSize(603,680);
        //设置界面标题
        this.setTitle("拼图小游戏 单机版v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面默认关闭模式
        this.setDefaultCloseOperation(3);
        //取消默认居中放置，只有取消了才能按照坐标轴来放置
        this.setLayout(null);
        //给界面添加键盘监听事件
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        if(code==65){
            //删除之前的图片
            this.getContentPane().removeAll();
            //加载完整的图片
            ImageIcon all=new ImageIcon(path+"\\all.jpg");
            //添加到管理容器
            JLabel All=new JLabel(all);
            //设置位置
            All.setBounds(83,134,420,420);

            //显示图片
            this.getContentPane().add(All);
            //加载背景图片
            ImageIcon bg=new ImageIcon("6.29\\image\\background.png");
            JLabel background=new JLabel(bg);
            //设置位置
            background.setBounds(40,40,508,560);
            //把背景图添加到界面
            this.getContentPane().add(background);
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利，如果胜利将不再执行后面的代码
        if(victory()){
            return;
        }
        int code=e.getKeyCode();
        if(code==37){
            if(x==3||x==7||x==11||x==15){
                return;
            }
            System.out.println("向左移动");

            //把空白图片右方的图片和空白图片交换
            //先交换数组中的位置
            arr[x]=arr[x+1];
            arr[x+1]=0;
            //更新图片0的位置
            x=x+1;
            //步数自增
            step++;
            //再根据最新的数组加载图片
            initimage();
        }
        else if(code==38){
            if(x==13||x==14||x==15||x==12){
                return;
            }
            System.out.println("向上移动");

            //把空白图片下方的图片和空白图片交换
            //先交换数组中的位置
            arr[x]=arr[x+4];
            arr[x+4]=0;
            //更新图片0的位置
            x=x+4;
            //步数自增
            step++;
            //再根据最新的数组加载图片
            initimage();
        }
        else if(code==39){
            if(x==0||x==4||x==8||x==12){
                return;
            }
            System.out.println("向右移动");
            //把空白图片左方的图片和空白图片交换
            //先交换数组中的位置
            arr[x]=arr[x-1];
            arr[x-1]=0;
            //更新图片0的位置
            x=x-1;
            //步数自增
            step++;
            //再根据最新的数组加载图片
            initimage();
        }
        else if(code==40){
            if(x==0||x==1||x==3||x==2){
                return;
            }
            System.out.println("向下移动");
            //把空白图片上方的图片和空白图片交换
            //先交换数组中的位置
            arr[x]=arr[x-4];
            arr[x-4]=0;
            //更新图片0的位置
            x=x-4;
            //步数自增
            step++;
            //再根据最新的数组加载图片
            initimage();
        }
        else if(code==65){
            initimage();
        }
        else if(code==87){
            //生成顺序数组
            arr=new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
            initimage();
        }
    }
    public boolean victory(){
        for (int i = 0; i < win.length; i++) {
            if(arr[i]!=win[i]){
                return false;
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取当前被点击的条目
        Object obj = e.getSource();
        if(obj==replyItem){
            System.out.println("重新游戏");
            //计步器清零
            step=0;
            //打乱数组
            luanxu();
            //重新加载图片
            initimage();

        }
        else if(obj==reLoginItem){
            System.out.println("重新登陆");
            //关闭当前界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();
        }
        else if(obj==closeItem){
            System.out.println("关闭游戏");
            //直接关闭虚拟机
            System.exit(0);
        }
        else if(obj==accountItem){
            System.out.println("关于我们");
        }
    }
}
